﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Threading.Thread;
using static System.Console;

namespace UnitTest
{
    /*
      假设某企业自产、自存、自销，需要将工厂生产的各类产品不定时的运到仓库，
      与此同时，需要将仓库中的货物运往超市和商场中进行销售，请编写一个程序模拟此过程（主要是存取这个过程）。
      1. 仓库的存量是固定的，可以假设为一个常量，比如20。
      2. 仓库满的时候，不能再向仓库中存货。
      3. 仓库空的时候，不能卖出货物。
      4. 存货和取货是同时进行的，不要出现先存满再取完货再存满再取完的效果或者存一个取一个再存再取这样的效果。
      5. 思路清晰，输出工整，编码规范，有正确的异常处理。
     */
    public class Unit_02
    {
        public static int ProductSum = 20;//目前仓库产品数量
        public static int MaxProduct = 50;//仓库容量
        private static object lock1 = new object();
        public static void Go()
        {
            for (int i = 1; i <= 10000; i++)
            {
                Random ran=new Random();
                Task task1 = Task.Run(() =>
                {
                    OutProduct(ran.Next(20));
                    InProduct(ran.Next(20));
                    OutProduct(ran.Next(20));
                    InProduct(ran.Next(20));
                    OutProduct(ran.Next(20));
                    InProduct(ran.Next(20));
                    OutProduct(ran.Next(20));
                    InProduct(ran.Next(20));
                });
            }
        }

        /// <summary>
        /// 出库
        /// </summary>
        /// <param name="num"></param>
        public static void OutProduct(int num)
        {
            lock (lock1)
            {
                if (ProductSum >= num)
                {
                    Task.Delay(200);
                    ProductSum -= num;
                    WriteLine($"已出库：{num}个,产品总数：{ProductSum}个。");
                }
                else
                {
                    WriteLine("仓库产品数量不足，出库失败！");
                }
            }
        }

        /// <summary>
        /// 进库
        /// </summary>
        /// <param name="num"></param>
        public static void InProduct(int num)
        {
            lock (lock1)
            {
                if (ProductSum + num <= MaxProduct)
                {
                    Task.Delay(200);
                    ProductSum += num;
                    WriteLine($"已入库：{num}个,产品总数：{ProductSum}个。");
                }
                else
                {
                    WriteLine("仓库容量已满，入库失败！");
                }
            }
        }
    }
}
